www.gusucode.com > MIMO与SISO仿真程序 > MIMO-OFDM/all code/MIMO_v6_0_2x2.m

    clc; clear all; close all

data = 2^16;                                    % data points

n_fft = 64;                                     % fft size
    
n_cp = 16;                                      % cyclic prefix

snr = [0:1:35];
%%
binary_data = round(rand(data,1));              % generate data

%%
mod_method = 4;       
                                                
mod_data = qammod(binary_data,mod_method,'unitaveragepower',true,'inputtype','bit');
%% STBC
% [x1 -x2* ; x2 x1*]
STBC = zeros(2*length(mod_data),1);
for i = 0:(length(mod_data)/2-1)
    STBC(4*i+1) = mod_data(2*i+1);
    STBC(4*i+2) = mod_data(2*i+2);
    STBC(4*i+3) = -conj(mod_data(2*i+2));
    STBC(4*i+4) = conj(mod_data(2*i+1));
end

STBC = reshape(STBC.',2,length(mod_data));
%% splitting up the data between the transmitters
Tx1 = STBC(1,:);
Tx2 = STBC(2,:);
%% IFFT
Xk1 = reshape(Tx1,n_fft,length(Tx1)/n_fft);
Xk2 = reshape(Tx2,n_fft,length(Tx2)/n_fft);

Xn1 = ifft(Xk1);
Xn2 = ifft(Xk2);
%% Cyclic prefix
Xn1_cp = [Xn1(:,(end - n_cp + 1):end),Xn1];  
Xn2_cp = [Xn2(:,(end - n_cp + 1):end),Xn2]; 

%% Channel
h = [randn()+randn()*1i, randn()+randn()*1i; randn()+randn()*1i, randn()+randn()*1i];

yn11 = Xn1_cp*h(1,1);            % y time, receiver 
yn21 = Xn2_cp*h(2,1);

yn12 = Xn1_cp*h(1,2);
yn22 = Xn2_cp*h(2,2);

% superposition of two received signals at receiver
yn1 = yn11 + yn21;                    % y(1) = h1*x1 + h2*x2 ; y(2) = -h2* x1* + h1 * x2*
yn2 = yn12 + yn22;

%% remove cyclic prefix
yn1_rcp = yn1(:,(n_cp + 1):end);
yn2_rcp = yn2(:,(n_cp + 1):end);

%% DFT
Yk1_block = fft(yn1_rcp);
Yk2_block = fft(yn2_rcp);

Yk1 = reshape(Yk1_block, 1, length(Tx1));              % transform 64 subchannels back into 1 stream
Yk2 = reshape(Yk2_block, 1, length(Tx2));

%% STBC decoding
abs_h = sum(sum(abs(h).^2));
% assume perfect channel estimation
H = [ conj(h(1,1)) , conj(h(1,2)), h(2,1), h(2,2) ; ...         % pseudo inverse
    conj(h(2,1)), conj(h(2,2)), -h(1,1) , -h(1,2)]./ abs_h;

X_hat1 = zeros(length(Yk1)/2,1);
X_hat2 = zeros(length(Yk2)/2,1);

X = zeros(length(binary_data)/2,1);

for i = 0:length(Yk1)/2-1
Yk1(2*i+2) = conj(Yk1(2*i+2));
Yk2(2*i+2) = conj(Yk2(2*i+2));

X_hat1(i+1) = H(1,1)*Yk1(2*i+1) + H(1,2)*Yk2(2*i+1) + H(1,3)*Yk1(2*i+2) + H(1,4)*Yk2(2*i+2);       
X_hat2(i+1) = H(2,1)*Yk1(2*i+1) + H(2,2)*Yk2(2*i+1) + H(2,3)*Yk1(2*i+2) + H(2,4)*Yk2(2*i+2);

X(2*i+1) = X_hat1(i+1);
X(2*i+2) = X_hat2(i+1);

end

%% demodulate
X_demod = qamdemod(X,4,'unitaveragepower',true,'outputtype','bit');
output = reshape(X_demod.',size(binary_data));
%%

errors = 0;
for i = 1:length(binary_data)
    if X_demod(i) ~= binary_data(i)
        errors = errors + 1;
    end
end